package com.wzkun.aicraft.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.wzkun.aicraft.model.dto.chathistory.ChatHistoryQueryRequest;
import com.wzkun.aicraft.model.entity.ChatHistory;
import com.wzkun.aicraft.model.entity.User;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import java.time.LocalDateTime;

/**
 *  服务层。
 *
 * @author wzk
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 新增对话信息
     * @param appId 应用id
     * @param message 消息
     * @param messageType 消息类型
     * @param userId 用户id
     * @return true/false
     */
    boolean addChatMessage(Long appId, String message, String messageType, Long userId);

    /**
     * 根据应用id删除关联的对话信息
     * @param appId 应用id
     * @return true/false
     */
    boolean deleteByAppId(Long appId);

    /**
     * 根据请求构造查询条件
     * @param chatHistoryQueryRequest 请求参数
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryRequest chatHistoryQueryRequest);

    /**
     * 分页查询某APP的对话记录
     * @param appId 应用id
     * @param pageSize 每页大小
     * @param lastCreateTime 最后创建时间
     * @param loginUser 当前登录用户
     * @return 查询结果
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize,
                                               LocalDateTime lastCreateTime,
                                               User loginUser);

    /**
     * 将数据库中对话历史记录加载到内存
     *
     * @param appId 应用程序ID，用于标识特定的应用程序实例
     * @param chatMemory 聊天内存对象，用于存储加载的聊天历史记录
     * @param maxCount 最大加载的消息数量，限制加载的历史记录条数
     * @return 返回实际加载到内存中的消息数量
     */
    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount);

}
